/**
 * HTPP客户端工具
 */
/**
 * 向服务器发送HTTP请求,返回服务器响应数据.支持get、post、delete、put、patch等请求.暂不支持文件上传
 * @param {Object} url 请求URL
 * @param {Object} type 请求方法
 * @param {Object} params 请求参数集
 * @param {Object} isJson  是否为JSON格式数据
 */
async function getResponse(url, type = 'get', params = {}, isJson = false) {
	try {
		//判断请求方法
		type = type.toLowerCase();
		if ('get|post|delete|put|patch'.match(type) == null) {
			throw new Error(`不支持的请求方式:${type}`);
		}
		const config = getConfig(type, params, isJson);
		if (config.hasOwnProperty('queryString')) {
			let queryString = config.queryString;
			if (-1 === url.indexOf('?')) {
				url = `${url}?${queryString}`
			} else {
				url = `${url}&${queryString}`
			}
		}
		// 发起请求并等待响应
		const response = await fetch(url, config);
		console.debug(url)
		//判断是否请求成功
		if (!response.ok) {
			throw new Error(`请求${url}失败,状态码:${response.status}`);
		}
		// 等待响应数据,将响应数据解析为 JSON
		const data = await response.json();
		//返回响应数据
		return data;
	} catch (error) {
		throw new Error(`请求${url}失败,原因:${error}`);
	}
}
/**
 * 获取fetch函数相关参数
 * @param {Object} type 请求方法
 * @param {Object} params 请求参数集
 * @param {Object} isJson  是否为JSON格式数据
 */
function getConfig(type, params, isJson) {
	//参数
	const config = {
		method: type
	};
	if (isEmptyJson(params)) {
		return config;
	}
	//向服务端传递JSON格式数据
	if ('put' === type || isJson) {
		config.headers = {
			'Content-Type': 'application/json'
		};
		config.body = JSON.stringify(params);
		return config;
	}
	//GET请求
	if ('get' === type) {
		config.queryString = new URLSearchParams(params).toString();
		return config;
	}
	//以form表单方式提交数据
	config.headers = {
		'Content-Type': 'application/x-www-form-urlencoded'
	};
	config.body = new URLSearchParams(params);
	return config;
}
/**
 * 判断JSON对象是否为空
 * @param {Object} obj
 */
function isEmptyJson(obj) {
	if (!isJsonObject(obj)) {
		return true;
	}
	for (let key in obj) {
		if (obj.hasOwnProperty(key)) {
			return false;
		}
	}
	return true;
};
/**
 * 判断是否为json对象
 * @param {Object} obj
 */
function isJsonObject(obj) {
	return typeof obj === 'object' &&
		obj !== null &&
		!Array.isArray(obj) &&
		Object.prototype.toString.call(obj) === '[object Object]';
}
export default getResponse